package com.parking.order.controller;


import cn.hutool.core.bean.BeanUtil;
import com.parking.common.core.model.PageInfo;
import com.parking.common.core.model.Result;
import com.parking.common.core.util.JwtUtil;
import com.parking.common.web.util.OssUtil;
import com.parking.order.model.dto.AddEnterInfoDto;
import com.parking.order.model.dto.AddOutInfoDto;
import com.parking.order.model.form.*;
import com.parking.order.model.param.AddEnterInfoParam;
import com.parking.order.model.param.AddOutInfoParam;
import com.parking.order.model.param.FindEntranceByOrderNumParam;
import com.parking.order.model.param.FindEntranceParam;
import com.parking.order.service.IEntranceInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 吴彦祖
 * @since 2023年11月28日
 */
@RestController
@Api(tags = "进出场信息")
@RequestMapping("/entranceInfo")
public class EntranceInfoController {
    /**
     * 进出场信息业务层
     */
    @Autowired
    private IEntranceInfoService entranceInfoService;

    /**
     * 图片上传工具类
     * */
    @Autowired
    private OssUtil ossUtil;

    /**
     * 添加入场信息
     * 参数 AddEnterInfoForm
     *      stallInfoId 车位信息Id
     *      carPlate 车牌号
     *      entranceImg 入场图片
     *      entranceEnterTime 入场时间
     *      authorization 物业token
     *
     * 返回 AddEnterInfoDto
     *      entranceInfoId 出入场信息Id
     *      userInfoId     用户信息Id
     *      userInfoName   用户名称
     *      certifiedInfoId 物业信息Id
     *      certifiedInfoName 物业名称
     *      certifiedInfoTel 物业电话
     *      certifiedInfoAddress 物业地址
     *      stallInfoId     车位信息Id
     *      stallInfo         车位号
     *      entranceInfoPlate 入场车牌号
     *      stallType        普通车位 0普通车位 1充电车位
     *      entranceEnterTime 入场时间
     *      entranceImg       入场图片
     *      orderInfoId       订单Id
     *      orderInfoNum      订单编号
     *      extraInfo         额外信息 提醒是否是该订单的第一次进入
     * */
    @PutMapping("/addEnterInfo.certified")
    @ApiOperation("添加入场信息")
    public Result<AddEnterInfoDto> addEnterInfo(@RequestBody @Valid AddEnterInfoForm form, @RequestHeader String authorization) throws Exception {
        AddEnterInfoParam param = BeanUtil.toBean(form, AddEnterInfoParam.class);
        param.setCertifiedId(JwtUtil.getCertifiedAccountId(authorization));
        AddEnterInfoDto dto = entranceInfoService.addEnterInfo(param);
        return Result.getResult(AddEnterInfoDto.class).setData(dto).setMessage("添加入场信息成功");
    }

    /**
     * 添加出场信息
     * 参数 AddOutInfoForm
     *      stallInfoId 车位信息Id
     *      carPlate 车牌号
     *      entranceOutTime 出场时间
     *      authorization  物业token
     *
     * 返回 AddOutInfoDto
     *      entranceInfoId 出入场信息Id
     *      userInfoId     用户信息Id
     *      userInfoName   用户名称
     *      certifiedInfoId 物业信息Id
     *      certifiedInfoName 物业名称
     *      certifiedInfoTel 物业电话
     *      certifiedInfoAddress 物业地址
     *      stallInfoId     车位信息Id
     *      entranceInfoPlate 入场车牌号
     *      stallInfo         车位号
     *      stallType        普通车位 0普通车位 1充电车位
     *      entranceEnterTime 入场时间
     *      entranceImg       入场图片
     *      entranceOutTime   出场时间
     *      orderInfoId       订单Id
     *      orderInfoNum      订单编号
     *      entraInfo         额外信息 提醒是否超时
     * */
    @PutMapping("/addOutInfo.certified")
    @ApiOperation("添加出场信息")
    public Result<AddOutInfoDto> addOutInfo(@RequestBody @Valid AddOutInfoForm form,@RequestHeader String authorization) throws Exception {
        AddOutInfoParam param = BeanUtil.toBean(form, AddOutInfoParam.class);
        param.setCertifiedId(JwtUtil.getCertifiedAccountId(authorization));
        AddOutInfoDto dto = entranceInfoService.addOutInfo(param);
        return Result.getResult(AddOutInfoDto.class).setData(dto).setMessage("添加出场信息成功");
    }
    /**
     * 物业上传进出口图片
     * 参数：file 上传的图片文件
     *      Authorization 物业token
     * 返回 String 图片访问路径
     * */
    @ApiOperation("物业上传进出口图片")
    @PostMapping("/uploadImage.certified")
    public Result<String> upLoadImage(MultipartFile file, @RequestHeader @Valid String authorization) throws Exception {
        JwtUtil.parseCertifiedToken(authorization);
        String path = ossUtil.uploadFile(file);
        return Result.getResult(String.class).setMessage("上传进出口图片成功").setData(path);
    }

    /**
     * 用户根据订单编号查询进出场信息
     * 参数 用户token authorization
     *      订单编号 orderInfoNum
     * 返回 List<String> 入场时间 - 出场时间
     * */
    @ApiOperation("用户根据订单编号查询进出场信息")
    @GetMapping("/findEntranceByOrderNum.user")
    public Result<List<String>> findEntranceByOrderNumUser(@Valid FindEntranceByOrderNumUserForm form, @RequestHeader String authorization) throws Exception {
        FindEntranceByOrderNumParam param = BeanUtil.toBean(form, FindEntranceByOrderNumParam.class);
        param.setUserId(JwtUtil.getUserId(authorization));
        List<String> infos = entranceInfoService.findEntranceByOrderNum(param);
        return Result.getListResult(String.class).setMessage("用户根据订单编号查询进出场信息成功").setData(infos);
    }

    /**
     * 出租客根据订单编号查询进出场信息
     * 参数 出租客token authorization
     *      订单编号 orderInfoNum
     * 返回 List<String> 入场时间 - 出场时间
     * */
    @ApiOperation("出租客根据订单编号查询进出场信息")
    @GetMapping("/findEntranceByOrderNum.renters")
    public Result<List<String>> findEntranceByOrderNumRenters(@Valid FindEntranceByOrderNumRentersForm form, @RequestHeader String authorization) throws Exception {
        FindEntranceByOrderNumParam param = BeanUtil.toBean(form, FindEntranceByOrderNumParam.class);
        param.setRentersId(JwtUtil.getRentersId(authorization));
        List<String> infos = entranceInfoService.findEntranceByOrderNum(param);
        return Result.getListResult(String.class).setMessage("出租客根据订单编号查询进出场信息成功").setData(infos);
    }
    /**
     * 平台根据订单编号查询进出场信息
     * 参数 平台token authorization
     *      订单编号 orderInfoNum
     * 返回 List<String> 入场时间 - 出场时间
     * */
    @ApiOperation("平台根据订单编号查询进出场信息")
    @GetMapping("/findEntranceByOrderNum.platform")
    public Result<List<String>> findEntranceByOrderNumPlatform(@Valid FindEntranceByOrderNumPlatformForm form, @RequestHeader String authorization) throws Exception {
        FindEntranceByOrderNumParam param = BeanUtil.toBean(form, FindEntranceByOrderNumParam.class);
        param.setPlatformId(JwtUtil.getPlatformId(authorization));
        List<String> infos = entranceInfoService.findEntranceByOrderNum(param);
        return Result.getListResult(String.class).setMessage("平台根据订单编号查询进出场信息成功").setData(infos);
    }

    /**
     * 物业查询进出场信息日志
     * 参数：Authorization 物业token
     *      pageNum 页数
     *      pageSize 每页大小
     *      startTime 开始时间
     *      endTime   结束时间
     *      stallInfo 车位号
     *      orderInfoNum 订单编号
     *      entranceInfoPlate 车牌号
     *      isOut 是否出场 0已出场 1未出场
     *
     * 返回 entranceInfoId 出入场信息Id
     *      orderInfoNum 订单编号
     *      userInfoId 用户信息Id
     *      userInfoName 用户名称
     *      userInfoTel 用户电话
     *      entranceInfoPlate 车牌号
     *       stallInfoId 车位信息Id
     *       stallInfo 车位号
     *       stallType 车位类型 0普通车位 1充电车位
     *       entranceEnterTime 入场图片
     *       entranceOutTime 出场图片
     *       entranceImg 入场图片
     * */
    @ApiOperation("物业查询进出场信息日志")
    @GetMapping("/findEntrance.certified")
    public Result<PageInfo> findEntrance(@Valid FindEntranceForm form, @RequestHeader String authorization) throws Exception {
        FindEntranceParam param = BeanUtil.toBean(form, FindEntranceParam.class);
        param.setCertifiedId(JwtUtil.getCertifiedAccountId(authorization));
        PageInfo page = entranceInfoService.findEntrance(param);
        return Result.getResult(PageInfo.class).setMessage("物业查询进出场信息日志成功").setData(page);
    }
}